package com.ol.edu.client.service.impl;


import com.ol.edu.client.entity.Course;
import com.ol.edu.client.mapper.CourseDao;
import com.ol.edu.client.service.CourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @BelongsProject: lagou-edu
 * @Author: GuoAn.Sun
 * @CreateTime: 2020-09-08 16:46
 * @Description:
 */
@Service
public class CourseServiceImpl implements CourseService {

    @Autowired
    private CourseDao courseDao;

    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;

    /**
     * 获取所有课程信息，包括讲师，章节，课时信息，是否活动课程
     * REDIS缓存数据
     * @return
     */
    public List<Course> getAllCourse() {
        //将redis内存中的序列化的集合名称用String重新命名（增加可读性）
        RedisSerializer rs = new StringRedisSerializer();
        redisTemplate.setKeySerializer(rs);

        //1.去redis查询数据集合
        System.out.println("--------------------->query redis");
        List<Course> list = (List<Course>)redisTemplate.opsForValue().get("allCourses");

//        2.如果redis中没有的话，去mysql数据集合
        if(list == null){
            synchronized (this){
                list = (List<Course>)redisTemplate.opsForValue().get("allCourses");
                if(list == null){
                    System.out.println("--------------------->query mysql");
                    list = courseDao.getAllCourse();
                    //3.将数据集合放入redis，以便下次查询使用
                    redisTemplate.opsForValue().set("allCourses",list,10, TimeUnit.MINUTES);
                }
            }
        }

        return list;
    }

    /**
     * 根据用户Id获取用户所拥有的 课程信息
     *
     * @param userId
     * @return
     */
    public List<Course> getCourseByUserId(String userId) {
        return courseDao.getCourseByUserId(userId);
    }

    /**
     * 根据课程编号获取对应的课程信息
     *
     * @param courseid 课程编号
     * @return
     */
    public Course getCourseById(Integer courseid) {
        return courseDao.getCourseById(courseid);
    }
}
